基于物理的材质

示例展示了基于物理的着色和 HDR 后处理在 Kanzi 中的用法。由于基于物理的着色和 HDR 后处理仍处于开发阶段,因此可以通过这些示例抢先了解在以后的 Kanzi 版本中能够使用的技术。

主要功能:

您可以在下面这些示例工程中找到一些示例,以了解基于物理的材质的使用方法:

限制

需要 OpenGL ES 扩展

支持后处理功能的高级材质需要 OpenGL ES 3.x 或者具有一组扩展的 OpenGL ES 2.0。当使用 OpenGL ES 2.0 时,需要以下 OpenGL ES 扩展:

即便无法获得这些扩展,也依然可以使用基于物理的材质和光源,但目前如果没有这些扩展,将无法使用后处理功能。

要使用后处理,在工程 (Project) > 属性 (Properties) 中至少将目标图形 API (Target Graphics API) 属性设为 OpenGL ES 2.0 扩展包 (OpenGL ES 2.0 Extension Pack)

后处理步骤概述

后处理需要执行以下主要步骤:

建立后处理

要使用后处理,您需要建立下面这些资源:

  1. 资源。Post_Processing 示例工程需要使用示例工程中的纹理、编译器、渲染通道、材质类型、着色器、材质、自定义属性类型等资源。

    您还需要使用 "Prefabs/Quad Scene" 预设件。这个场景预设件只包含一个特制的对象:一个范围为 (-1, -1) 到 (1, 1) 的四边形。四边形具有一个 "Quad" 标签,后处理编译器会使用它为要对纹理应用后处理效果的渲染通道指定对象源。请勿修改这个预设件。

    示例工程有两个版本。Post_Processing_Simple 几乎无需设置,而 Post_Processing 有一些额外的页面,用于显示已执行和未执行后处理的场景以及显示中间纹理。

    示例工程的目标分辨率为 1920x1080。示例工程的调试版本具有可实现另外几种分辨率的资源。

  2. 主场景预设件模板。主场景必须来自于一个预设件。在示例工程中,此预设件被称为 "Prefabs/Main Scene"。您需要将要使用后处理功能渲染的内容放在这里。

    为了支持基于物理的材质着色,场景预设件必须具有下面这些属性:

    此外,必须将场景预设件模板的 "Prefab preview mode" 属性设置为 1。值将在占位符中被重写。这样,当预览预设件占位符合成(值 1)时,材质着色器会执行另一次的色调映射。通常在后处理(值 0)之后或即将结束时执行色调映射。

    有关这些属性的详细说明,请参阅属性类型 (Property Types)

  3. 后处理属性的主节点。工程必须具有一个祖先节点,而且祖先节点包含用于控制后处理效果的属性。在示例工程中,节点是一个名为 "Page" 的主页面。
  4. 场景到纹理的视口。来自上一步骤的节点 ("Page") 必须包含一个用于将场景渲染到纹理的视口。在 Post_Processing_Simple 示例工程中,视口名为 "Page/Scene to Texture"。

    必须将视口的图层长宽比 (Layer Aspect Ratio) 属性设置为与目标分辨率的长宽比匹配的值。在示例工程中,目标分辨率为 1920x1080,长宽比为 1.777。

    视口还应具有一个别名,以便于访问图层长宽比 (Layer Aspect Ratio) 属性。在示例工程中,"Screen" 的资源字典具有 "Viewport" 别名。

  5. "Scene to Texture" 的场景占位符。来自上一步骤的视口 ("Page/Scene to Texture") 必须具有一个场景占位符,占位符用于将来自 ("Prefabs/Main Scene") 步骤的 "Main Scene" 预设件模板实例化。在示例工程中,场景占位符名 "Scene to Texture/Scene (Main Scene)"。

    场景占位符必须具有值为 "Render to Texture (1920x1080) Composer" 的 Composer 属性值。

    必须将场景占位符的 "Prefab Preview Mode" 属性设置为 0。这样会命令材质着色器正常运行(不执行额外的色调映射)。

    节点会将主场景的内容渲染到 "HDR Render 1920x1080" 渲染目标纹理,随后会将纹理用作后处理操作的输入。

  6. 允许访问 "Inverse Exposure" 属性。主场景 (Main Scene) 预设件模板的预览 (Preview) 合成需要使用曝光值的值进行色调映射。由于预设件无法访问除预设件以外的任何内容,因此属性存储在预设件中,并可供使用预设件占位符的工程使用。

    来自上一步骤的 ("Scene (Main Scene)") 必须具有一个别名,以便于访问曝光属性。在示例工程中,屏幕 (Screen) 的资源字典具有指向场景占位符的 "MainScene" 别名。

    对于 "Inverse Exposure" 属性,来自第 3 步的节点 ("Page") 必须具有绑定:

    {#MainScene/Exposure}

    需要曝光设置的后处理节点会通过绑定和属性继承从来自第 3 步的节点 ("Page") 获取曝光设置。

  7. "Post Processing Intermediate" 的视口。来自第 3 步的节点 ("Page") 必须包含一个用于中间后处理操作的视口。在示例工程中,视口名为 "Page/Post Processing Intermediate"。
  8. "Post Processing Intermediate" 的场景占位符。来自上一步骤的视口 ("Page/Post Processing Intermediate") 必须包含一个用于 "Prefabs/Quad Scene" 预设件(来自第 1 步)的场景占位符。在示例工程中,这是 "Post Processing Intermediate/Scene (Quad Scene)"。

    必须将场景占位符的编译器 (Composer) 属性设置为 "Post Processing (1920x1080) Intermediate Composer"。

    用于在编译器中产生全屏泛光效果的着色器需要使用下面这些属性来控制全屏泛光效果:

    这些属性是可继承的属性,它们来自第 3 步中的节点 ("Page")。

    视口必须具有一个用于 Inverse Exposure 属性的绑定,以使其使用来自场景的值:

    - {Inverse Exposure} = {../Scene/Exposure}

    有关这些属性的详细说明,请参阅属性类型 (Property Types)

  9. "Final Composition" 的视口。来自第 3 步的节点 ("Page") 必须包含一个用于最终合成的视口。在 Post_Processing_Simple 示例工程中,视口名为 "Page/Final Composition"。
  10. "Final Composition" 的场景占位符。来自第 9 步的视口 ("Page/Final Composition") 应包含一个用于 "Prefabs/Quad Scene" 预设件的场景占位符(来自第 1 步)。在示例工程中,场景名为"Final Composition/Scene (Quad Scene)"。

    必须将场景占位符的编译器属性设置为 "Post Processing (1920x1080) Final Composer"。

    用于执行全屏泛光合成和色调映射的着色器需要使用下面这些属性:

    这些属性是可继承的属性,它们必须来自第 3 步中的节点 ("Page")。

    有关这些属性的详细说明,请参阅属性类型 (Property Types)

材质和纹理 (Materials and Textures)

请注意,严禁修改这些纹理。

编译器

属性类型 (Property Types)

基于物理的光源属性:

后处理(全屏泛光效果和色调映射)属性:

环境属性:

材质属性:

基于物理的材质类型

此文件夹中的所有材质类型都对基于物理的材质使用相同的着色器源。材质类型已通过预处理器定义 (Preprocessor Defines) 属性进行自定义。各种预处理器定义 (Preprocessor Defines) 属性的主要用途是允许创建经过优化的着色器变体。理论上可以使用一个或少数几个基于物理的材质类型变体。但在实践中,可能需要创建更多的基于物理的材质类型变体以实现更高的性能。

要创建新的变体,请复制现有的材质类型,即调整后的预处理器定义所需的最小功能数量,然后点击同步 uniform (Sync with Uniforms)

着色器使用以下预处理器定义 (Preprocessor Defines):

您可以使用这些预处理器定义 (Preprocessor Defines) 进行调试。要允许调试,请将下面这些值设置为 1:

虽然需要使用这些预处理器定义,但它们用于仍处于开发阶段的功能。对于下面这些属性,请始终使用值 0:

后处理材质类型

另请参阅

示例